package educar.models;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import educar.db.JPA;

public class Actividad {
  private int codigo;
  private int codigoMateria;
  private String descripcion;
  private ArrayList<Solucion> soluciones;
  private ArrayList<Correccion> correcciones; 
  private static JPA jpa = new JPA();
  
  /**
   * 	
   * @param nuevaDescripcion "nombre de la actividad"
   * @param codigoDeMateria "codigo de la materia de la actividad"
   */
  public Actividad(String nuevaDescripcion,int codigoDeMateria){
    descripcion=nuevaDescripcion;
	codigoMateria=codigoDeMateria;
  }
  
  /**
   * 
   * @return codigo "codigo de la actividad"
   */
  public int getCodigo(){
    return codigo;
  }
  
  /**
   * 
   * @return descripcion "nombre de la actividad"
   */
  public String getDescripcion(){
    return descripcion;
  }
  
  /**
   * 
   * @return codigoMateria "codigo de la materia a la cual pertenece la actividad"
   */
  public int getCodigoMateria() {
    return codigoMateria;
  }
  
  /**
   * 
   * @param cod "codigo de la actividad"
   */
  public void setCodigo(int cod) {
    codigo=cod;
  }
  
  /**
   * Guarda en un ArrayList todad las soluciones cargadas por 
   * alumnos para una acitividad
   * @return soluciones "soluciones de las actividades "
   */
  public ArrayList<Solucion> getSoluciones(){
    return soluciones;
  }
  
  /**
   * Guarda en un ArrayList todad las correcciones cargadas por 
   * docente para una acitividad
   * @return correcciones " correccion de cada actividad"
   */
  public ArrayList<Correccion> getCorrecciones(){
    return correcciones;
  }
  
  /**
   * Guarda en un ArrayList todas las actividades que posee una materia
   * @param codigoMateria "codigo de una materia"
   * @return actividades "lista de actividades"
   * @throws SQLException
   */
  public static ArrayList<String> getActividadesPorMateria(String codigoMateria) throws SQLException{ 
    ResultSet resultado = jpa.showAll("actividad");
    ArrayList<String> actividades = new ArrayList<String> ();
    while (resultado.next()) {
      if((Integer.toString(resultado.getInt(3))).equals(codigoMateria)){
        actividades.add("(" + Integer.toString(resultado.getInt(1)) + ")  " + resultado.getString(2));
      }
    }
    return actividades;
  }
  
  /**
   * Guarda en un  ArrayList todas las actividades de una materia
   * @param codigoMateria "codigo de una materia"
   * @return lista "lista con actividades de una materia"
   */
  public ArrayList<Actividad> getActividadesByMateria(String codigoMateria){
    ResultSet rs = null;
	ArrayList<Actividad> lista=new ArrayList<Actividad>();
	rs = jpa.getByField("actividad","cod_materia",codigoMateria);
	try {
	  if (rs.next()){
	    Actividad nueva=new Actividad(rs.getString(2),rs.getInt(3));
		nueva.setCodigo(rs.getInt(1));
		lista.add(nueva);
	  }
	} 
	catch (SQLException e) {
	  e.printStackTrace();
	}
	return lista;
  }
  
  /**
   * Busca una actividad con un codigo de actividad
   * @param codigoActividad "codigo de una actividad"
   * @return 
   */
  public static Actividad getActividadByCodigo(String codigoActividad) {
    ResultSet rs = null;	
	rs = jpa.getByField("actividad","cod_act",""+codigoActividad);
	try {
	  if (rs.next()){
	    Actividad nueva=new Actividad(rs.getString(2),rs.getInt(3));
		nueva.setCodigo(rs.getInt(1));
		return nueva;
	  }				
	} 
	catch (SQLException e) {
	  e.printStackTrace();
	}
	return null;
  }
  
  /**
   * Guarda y confirma la carga de una actividad
   * @return true "si la actividad se cargo correctamente"
   * @return false "si la actividad no se cargo correctamente"
   */
  public boolean save() {
    String[] columns = { "cod_act","descripcion","cod_materia" };
	PreparedStatement stm = jpa.newRecord("educar_dev.actividad", columns);
	int cantActividades;
	try {
	  cantActividades = Actividad.getActividadesPorMateria(""+codigoMateria).size();
	  int nuevoNum=Integer.parseInt(""+codigoMateria+cantActividades)+90;
	  stm.setInt(1,nuevoNum);
	  stm.setString(2,this.getDescripcion());
	  stm.setInt(3,this.getCodigoMateria());
	  jpa.create(stm);
	} 
	catch (SQLException e) {
	  return false;
	}
	return true;
  }
  
  /**
   * Elimina una actividad realizada por un alumno 	
   */
  public void destroy() {
    jpa.destroy("realiza","cod_act",""+this.getCodigo());
    jpa.destroy("actividad","cod_act",""+this.getCodigo()); 
  }
  
  /**
   * Guarda en un ArrayList todas las actividades de un alumno	
   * @param dniAlumno "dni del alumno"
   * @return actividades "lista de actividades de un alumno"
   */
  public static ArrayList<Integer> getActividadesPorAlumno(String dniAlumno) {
    ResultSet codigosActividades = jpa.showAll("realiza");
    ArrayList<Integer> actividades = new ArrayList<Integer> ();
    try{
      while (codigosActividades.next()) {
      if(Integer.toString(codigosActividades.getInt(1)).equals(dniAlumno))
        actividades.add(codigosActividades.getInt(2));
      } 
    } 
    catch(SQLException e) {}
      return actividades;
  }
}
